package Test.限流算法;

/**
 * @Author: kirito
 * @Description:
 * 固定窗口限流算法（Fixed Window Rate Limiting Algorithm）是一种最简单的限流算法，
 * 其原理是在固定时间窗口(单位时间)内限制请求的数量。
 * 该算法将时间分成固定的窗口，并在每个窗口内限制请求的数量。
 * 具体来说，算法将请求按照时间顺序放入时间窗口中，并计算该时间窗口内的请求数量，
 * 如果请求数量超出了限制，则拒绝该请求。
 *
 * 假设单位时间(固定时间窗口)是1秒，限流阀值为3。在单位时间1秒内，每来一个请求,计数器就加1，
 * 如果计数器累加的次数超过限流阀值3，后续的请求全部拒绝。等到1s结束后，计数器清0，重新开始计数
 *
 * 优点：固定窗口算法非常简单，易于实现和理解。
 * 缺点：存在明显的临界问题，比如: 假设限流阀值为5个请求，单位时间窗口是1s,
 * 如果我们在单位时间内的前0.8-1s和1-1.2s，分别并发5个请求。虽然都没有超过阀值，
 * 但是如果算0.8-1.2s,则并发数高达10，已经超过单位时间1s不超过5阀值的定义啦。
 * @Date: 2024/2/28 14:37
 * @Version: 1.0
 */

public class 固定窗口 {
    public static Integer counter = 0;  //统计请求数
    public static long lastAcquireTime =  0L;
    public static final Long windowUnit = 1000L ; //假设固定时间窗口是1000ms
    public static final Integer threshold = 10; // 窗口阀值是10

    /**
     * 固定窗口时间算法
     * @return
     */
    public synchronized boolean fixedWindowsTryAcquire() {
        long currentTime = System.currentTimeMillis();  //获取系统当前时间
        if (currentTime - lastAcquireTime > windowUnit) {  //检查是否在时间窗口内
            counter = 0;  // 计数器清0
            lastAcquireTime = currentTime;  //开启新的时间窗口
        }
        if (counter < threshold) {  // 小于阀值
            counter++;  //计数统计器加1
            return true;
        }

        return false;
    }
}
